//用于启动服务
const express = require('express');
const app = express();
app.listen(3006, () => console.log('server running~'));

//加载cors模块，解决跨域
const cors = require('cors');
app.use(cors());

//开放静态资源
app.use(express.static('uploads'));

//加载express-jwt，用于解密token，并且也能控制哪些接口需要认证，哪些不需要认证
const expressJWT = require('express-jwt');
//expressJWT().unless(控制哪些接口不需要认证)
//解密token的时候，如果报错，会将错误next(err)到错误处理中间件
//只要是token中保存的数据，都通过req.user来获取
//这是因为express-jwt中间件解密来token，把token中保存的数据赋值给了req.user
app.use(expressJWT({
    secret: 'hwm',//加密token时的设置的那个key
    algorithms: ['HS256']//固定写法
}).unless({
    // path: ['/api/login', '/api/reguser']//除了登录注册接口之外，其他接口都需要认证
    path: /^\/api/,//以 /api 开头的接口不需要认证  值可以是字符串，数组，正则表达式
}));


//接收urlencoded类型的请求体  查询字符串格式的
app.use(express.urlencoded({ extended: false }));

//加载路由模块  ---login
let loginRouter = require('./routers/login');
//注册成中间件
// app.use('xxx', (req, res, next) => { });
app.use('/api', loginRouter);

//先加载category模块，再加载user模块比较好
//如果category也是以my开头的，这样就可以直接进入category模块，而不会先进入user比对一次  提高性能
//加载路由模块  ---category
let categoryRouter = require('./routers/category');
//注册成中间件
app.use('/my/article', categoryRouter);


//在分类后面加载article模块
let articleRouter = require('./routers/article');
//注册成中间件
app.use('/my/article', articleRouter);

//加载路由模块  ---user
let userRouter = require('./routers/user');
//注册成中间件
app.use('/my', userRouter);


//错误处理中间件放最后  四个参数都有就是错误处理中间件
app.use(function (err, req, res, next) {
    //下面处理token解析方面的错误
    if (err.name === 'UnauthorizedError') {
        res.status(401).send({ status: 1, message: '身份认证失败！' });
    }

    //下面处理数据验证方面的错误
    // console.log(err.error.message);
    // console.log(err.error.name);
    if (err.error && err.error.name === 'ValidationError') {
        res.send({ status: 1, message: err.error.message });
    }

});




